Evolutionary programming techniques often work well because they combine and/or modify code in ways that programmers would not have thought of or chosen to experiment with. Generally, though, evolutionary programming techniques perform with little or no knowledge of or guidance related to the context of the programs that are being combined and/or modified. As such, these techniques lack the ability to make evolutionary programming changes based on those known aspects and may take too long to evolve code in a beneficial manner.
For example, evolutionary programming techniques may be used to evolve a set of programs that, at least in part, calculate a sine function. In general, the evolutionary programming technique might combine two programs, but not know where the sine function calculation is located within the code. As such, it may evolve the sine function based on a combination of the sine function in one set of code with code that calculates something other than the sine function from the other set of code. As such, the result is less likely to result in a beneficial outcome (e.g., a better functioning or “higher fitness” program, by whatever measure might be appropriate). Even if the evolutionary programming technique uses a code-matching algorithm to attempt to find portions of the code that are similar between the two programs, it might fail. For example, even assuming that the code-matching algorithm did find the closest code segments between two programs, depending on the implementation, the code for calculating sine in the first program may actually be more similar to the code for calculating cosine in the second program that it is to the code for calculating sine in the second program. As such, the evolutionary programming technique that used this matching might combine and evolve the code for calculating sine with the code for calculating cosine.
As used herein, “code”, “set of code” or “code set” are broad terms, encompassing numerous embodiments, including, without limitation, full programs (whether compilable, interpretable, executable, or the like), portions of programs, libraries, context-action pairs, data and data structures, and the like.
Techniques herein address these issues.